/* 该程序中显示的是一个全局错误值的同步实现。
 * 来自不同文件的函数用来自不同函数的返回值调用seterror函数。如果参数error为0，则seterror函数就立即返回，
 * 说明没有错误；否则，seterror函数就获取互斥量，并且在globalerror为0的情况下将errnor赋给globalerror。
 * 这样，globalerror就持有赋予它的第一个错误的错误码。
 * 
 * 要注意的是：除非在获取或释放内部互斥量时就有问题，否则seterror函数就返回最初的错误。
 * 在这种情况下，全局错误值就可能是没有意义的，并且seterror和geterror函数都返回来自锁定问题的错误码。
 * */

#include "globalerror.h"
/* 获取错误标志 */
int geterror(int *error) {
    int terror;
    if (terror = pthread_mutex_lock(&errorlock))
        return terror;
    *error = globalerror;
    return pthread_mutex_unlock(&errorlock);
}

/* 如果是第一个错误，globalerror就设置为error */
int seterror(int error) {
    int terror;
    // 如果error不是错误，则不改变globalerror
    if (!error) 
        return error;
    
    if (terror = pthread_mutex_lock(&errorlock))
        return terror;
    
    globalerror = error;

    terror = pthread_mutex_unlock(&errorlock);

    return terror ? terror : error;
}
